﻿using PTCN.CrossPlatform.BettingGame.Utilities;
using PTCN.CrossPlatform.BettingGame.Utilities.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SW.Webbase.MiniGame.Bingo.BingoLogic
{
    public class Ticket
    {
        #region Properties
        private int _Value = -1;
        public int Value
        {
            set { _Value = value; }
            get { return _Value; }
        }
        private bool _seleted = false;
        public bool Selected
        {
            set { _seleted = value; }
            get { return _seleted; }
        }

        private bool _OK = false;
        public bool OK
        {
            set { _OK = value; }
            get { return _OK; }
        } 
        #endregion

        #region Functions
        /// <summary>
        /// Sinh ngẫu nhiên 1 list các vé theo số vé
        /// </summary>
        /// <param name="ticketnum">Số lượng vé cần sinh</param>
        /// <returns></returns>
        public List<Ticket[,]> GenTicket(int ticketnum)
        {
            //var bingoNum = getBingoNumConfig(ticketnum);
            List<Ticket[,]> listTicket = new List<Ticket[,]>();

            Ticket[,] t;

            for (int tk = 0; tk < ticketnum; tk++)
            {
                t = new Ticket[5, 5];
                for (int i = 0; i < 5; i++)
                {
                    switch (i)
                    {
                        case 0:
                            var l = getListNumber(5, 1, 15, 0);
                            t[i, 0] = new Ticket() { Value = l[0] };
                            t[i, 1] = new Ticket() { Value = l[1] };
                            t[i, 2] = new Ticket() { Value = l[2] };
                            t[i, 3] = new Ticket() { Value = l[3] };
                            t[i, 4] = new Ticket() { Value = l[4] };
                            break;
                        case 1:
                            l = getListNumber(5, 16, 30, 0);
                            t[i, 0] = new Ticket() { Value = l[0] };
                            t[i, 1] = new Ticket() { Value = l[1] };
                            t[i, 2] = new Ticket() { Value = l[2] };
                            t[i, 3] = new Ticket() { Value = l[3] };
                            t[i, 4] = new Ticket() { Value = l[4] };
                            break;
                        case 2:
                            l = getListNumber(5, 31, 45, 0);
                            t[i, 0] = new Ticket() { Value = l[0] };
                            t[i, 1] = new Ticket() { Value = l[1] };
                            t[i, 2] = new Ticket() { Value = l[2] };
                            t[i, 3] = new Ticket() { Value = l[3] };
                            t[i, 4] = new Ticket() { Value = l[4] };
                            break;
                        case 3:
                            l = getListNumber(5, 46, 60, 0);
                            t[i, 0] = new Ticket() { Value = l[0] };
                            t[i, 1] = new Ticket() { Value = l[1] };
                            t[i, 2] = new Ticket() { Value = l[2] };
                            t[i, 3] = new Ticket() { Value = l[3] };
                            t[i, 4] = new Ticket() { Value = l[4] };
                            break;
                        case 4:
                            l = getListNumber(5, 61, 75, 0);
                            t[i, 0] = new Ticket() { Value = l[0] };
                            t[i, 1] = new Ticket() { Value = l[1] };
                            t[i, 2] = new Ticket() { Value = l[2] };
                            t[i, 3] = new Ticket() { Value = l[3] };
                            t[i, 4] = new Ticket() { Value = l[4] };
                            break;
                    }
                }
                listTicket.Add(t);
            }

            return listTicket;
        }

        

        /// <summary>
        /// Kiểm tra vé có đạt bingo tại thời điểm hiện tại không
        /// </summary>
        /// <param name="matrix">Ma trận theo user</param>
        /// <param name="listNumber">danh sách các số đã xuất hiện</param>
        /// <returns></returns>
        public bool CheckBingo(Ticket[,] matrix, List<int> listNumber)
        {
            var listPattern = new Pattern().getListPattern();
            int countOK = 0;
            foreach (Pattern p in listPattern)
            {
                countOK = 0;
                var lpData = p.ListPatternData;
                foreach (PatternData pData in lpData)
                {
                    //Kiểm tra xem phần tử được bingo này người dùng đã chọn hoạc có được không
                    if (listNumber.Contains(matrix[pData.Row - 1, pData.Col - 1].Value) == true && matrix[pData.Row - 1, pData.Col - 1].Selected == true)
                        countOK++;
                }

                //Đạt bingo
                if (countOK == lpData.Count)
                {
                    return true;
                }
            }

            return false;
        }

        //tinh toan so min va max cua 1 cot

        public List<int> get75Number()
        {
            return getListNumber(75, 1, 75, 0);
        }



        public int getBingoByTicket(int ticketnum)
        {
            try
            {
                string[] p = FileUtil.readFile("DataConfig\\TicketBingo.txt");
                if (ticketnum > p.Count())
                    return int.Parse(p[p.Count() - 1].Split('|')[1]);

                foreach (string s in p)
                {
                    if (s.StartsWith("#") == false)
                    {
                        if (int.Parse(s.Split('|')[0]) == ticketnum)
                            return int.Parse(s.Split('|')[1]);
                    }
                }

                return -1;

            }
            catch (Exception ex)
            {
                NLogManager.LogMessage("getBingoNum error: " + ex.Message);
                return -2;
            }
        }

        //public List<int> getList75()
        //{
        //    return getListNumber();
        //}

        private List<int> getListNumber(int take, int min, int max, int notin)
        {

            var ls = new List<int>();
            int maxNumber = max;
            int minNumber = min;

            for (int j = minNumber; j < maxNumber + 1; j++)
            {
                if (j != notin)
                    ls.Add(j);
            }

            return ls.OrderBy(a => Guid.NewGuid()).Take(take).ToList();
        }

        #endregion
              
    }
}